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