[C#] Linq에서 int를 문자열로 변환하는 데 문제가 있습니다.

var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
                Text = c.Name
            };
var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
                Text = c.Name
            };

어쨌든 내가 이것을 달성 할 수 있습니까? VB.NET에서는 첫 번째 스 니펫을 사용하면 아무런 문제가 없으며 VB는 유연하며 C #의 엄격성에 익숙해 질 수 없습니다!



답변

EF v4에서는을 사용할 수 있습니다 SqlFunctions.StringConvert. int에 대한 과부하가 없으므로 두 배 또는 소수로 캐스트해야합니다. 코드는 다음과 같이 보입니다.

var items = from c in contacts
            select new ListItem
            {
                Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
                Text = c.Name
            };


답변

쿼리에서 정수를 문자열로 변환하여 비슷한 문제를 해결했습니다. 이것은 쿼리를 객체에 넣어서 달성 할 수 있습니다.

var items = from c in contacts
            select new
            {
                Value = c.ContactId,
                Text = c.Name
            };
var itemList = new SelectList();
foreach (var item in items)
{
    itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name });
}


답변

LinqToObject : 연락처를 사용하십시오. AsEnumerable ()

var items = from c in contacts.AsEnumerable()
            select new ListItem
            {
                Value = c.ContactId.ToString(),
                Text = c.Name
            };


답변

SqlFunctions.StringConvert는 작동하지만 번거롭고 대부분 SQL 측에서 문자열 변환을 수행 할 필요가 없습니다.

문자열 조작을 수행하려면 먼저 linq-to-entities에서 쿼리를 수행 한 다음 linq-to-objects에서 찌르기를 조작해야합니다. 이 예에서는 Contact의 전체 이름과 ContactLocationKey (ContactID 및 LocationID)의 문자열 연결 인 ContactLocationKey를 포함하는 데이터 세트를 가져 오려고합니다.

// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
   (from c in Context.Contacts
   select new {
       c.ContactID,
       c.FullName,
       c.LocationID
   }).ToArray();

// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
   (from c in data
    select new {
       c.FullName,
       ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
       Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
    }).ToArray();

이제 두 개의 익명 선택을 작성 해야하는 번거 로움이 있지만 L2E에서 지원되지 않는 문자열 (및 기타) 기능을 편리하게 수행 할 수 있다고 생각합니다. 또한이 방법을 사용하면 성능이 저하 될 수 있습니다.


답변

public static IEnumerable<SelectListItem> GetCustomerList()
        {
            using (SiteDataContext db = new SiteDataContext())
            {
                var list = from l in db.Customers.AsEnumerable()
                           orderby l.CompanyName
                           select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };

                return list.ToList();
            }
        }


답변

var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

먼저 객체로 변환하면 toString ()이 정확합니다.


답변

Brian Cauthon의 답변은 훌륭합니다! EF 6의 경우 약간의 업데이트만으로 클래스가 다른 네임 스페이스로 이동했습니다. 따라서 EF 6 이전에는 다음을 포함해야합니다.

System.Data.Objects.SqlClient

EF 6으로 업데이트하거나이 버전을 사용중인 경우 다음을 포함하십시오.

System.Data.Entity.SqlServer

EF6에 잘못된 네임 스페이스를 포함 시키면 코드가 정상적으로 컴파일되지만 런타임 오류가 발생합니다. 이 노트가 혼란을 피하는 데 도움이되기를 바랍니다.