Linkq에서 문자열을 엔티티로 변환하는 데 문제가 있습니다.
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와 함께 사용할 수 있습니다.int에 대한 과부하가 없으므로 2배 또는 10진수로 캐스팅해야 합니다.코드는 다음과 같이 표시됩니다.
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 });
}
LinkqToObject: 연락처를 사용합니다.열거형()
var items = from c in contacts.AsEnumerable()
select new ListItem
{
Value = c.ContactId.ToString(),
Text = c.Name
};
Sql 함수입니다.StringConvert는 작동하지만 번거롭고 SQL 측에서 문자열 변환을 수행할 필요가 거의 없습니다.
문자열 조작을 수행하려면 먼저 linq-to-entity에서 쿼리를 수행한 다음 linq-to-object에서 스팅을 조작해야 합니다.이 예에서는 연락처의 전체 이름과 두 정수 열(연락처)의 문자열 결합인 ContactLocationKey가 포함된 데이터 집합을 가져옵니다(연락처ID 및 위치신분증).
// 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();
}
}
브라이언 코튼의 대답은 훌륭합니다!EF 6의 경우 클래스가 다른 네임스페이스로 이동되었습니다.따라서 EF 6 이전에 다음을 포함해야 합니다.
System.Data.Objects.SqlClient
EF 6으로 업데이트하거나 이 버전을 사용하는 경우 다음을 포함합니다.
System.Data.Entity.SqlServer
잘못된 네임스페이스를 EF6에 포함하면 코드는 잘 컴파일되지만 런타임 오류가 발생합니다.이 노트가 혼동을 피하는 데 도움이 되었으면 합니다.
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
Text = a.ClassName,
Value = a.ClassId.ToString()
});
먼저 객체로 변환한 다음 String()으로 변환하면 됩니다.
하나 더 해결책:
c.ContactId + ""
빈 문자열만 추가하면 문자열로 변환됩니다.
MVC 2 앱을 MVC 3으로 변환할 때 동일한 문제가 발생했습니다. 이 문제에 대한 다른 (깨끗한) 해결책을 제공하기 위해 제가 한 일을 게시하고 싶습니다.
IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
"ID", "Name", model.ProducerID);
GetProducers()는 Producers의 엔티티 컬렉션을 반환합니다.추신: SqlFunctions.StringConvert는 제게 맞지 않았습니다.
당신의 "연락처"가 제네릭 리스트 역할을 하고 있다면, 아래 코드가 잘 작동하기를 바랍니다.
var items = contact.Distinct().OrderBy(c => c.Name)
.Select( c => new ListItem
{
Value = c.ContactId.ToString(),
Text = c.Name
});
감사해요.
MySql을 사용하여SqlFunctions.StringConvert
나한텐 안 통했어요사용하고 있기 때문에SelectListItem
프로젝트 내 20개 이상의 장소에서 20개 이상의 LINQ 문장을 왜곡하지 않고 작동하는 솔루션을 원했습니다.내 해결책은 하위 클래스에 있었습니다.SelectedListItem
타입 변환을 LINQ에서 멀어지게 하는 정수 세터를 제공하기 위해서입니다. 분명히 이 솔루션은 일반화하기 어렵지만 제 특정 프로젝트에 꽤 도움이 되었습니다.
를 사용하려면 다음 유형을 만들고 다음 대신 LINQ 쿼리에서 를 사용합니다.SelectedListItem
값 대신 IntValue를 사용합니다.
public class BtoSelectedListItem : SelectListItem
{
public int IntValue
{
get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
set { Value = value.ToString(); }
}
}
만약 당신이 엔티티 프레임워크를 사용하고 유일한 int를 허용하고 싶다면, 당신은 이 inlq 쿼리를 사용할 수 있습니다.
var items = from c in contacts
select new ListItem
{
Value = (int)ContractId
Text = c.Name
};
(int)를 사용하면 값이 int에 캐스팅되어 문자열을 int로 변환할 필요가 없고 원하는 결과를 얻을 수 있기 때문에 작동합니다.
이것은 내 프로젝트에서 나에게 효과가 있었습니다. 나는 그것이 당신에게 도움이 될 것이라고 생각합니다.
모델을 "확장"하려면 부분 클래스를 생성하고 나머지 클래스 속성을 활용할 수 있는 읽기 전용 속성을 추가해야 합니다.
public partial class Contact{
public string ContactIdString
{
get{
return this.ContactId.ToString();
}
}
}
그리고나서
var items = from c in contacts
select new ListItem
{
Value = c.ContactIdString,
Text = c.Name
};
var items = from c in contacts
select new ListItem
{
Value = String.Concat(c.ContactId), //This Works in Linq to Entity!
Text = c.Name
};
나는 그것을 발견했습니다.SqlFunctions.StringConvert((double)c.Age)
나에게도 통하지 않았습니다. 그 분야는 유형입니다.Nullable<Int32>
지난 며칠간의 시행착오 끝에 이걸 찾는 데 많은 시간이 걸렸습니다.
이것이 밖에 있는 몇몇 코더들에게 도움이 되기를 바랍니다.
시도해 볼 수 있습니까?
var items = from c in contacts
select new ListItem
{
Value = Convert.ToString(c.ContactId),
Text = c.Name
};
언급URL : https://stackoverflow.com/questions/1066760/problem-with-converting-int-to-string-in-linq-to-entities
'programing' 카테고리의 다른 글
PowerShell에서 DateTime을 포맷하는 방법 (0) | 2023.04.26 |
---|---|
번들 및 축소된 파일을 Windows Azure CDN에 업로드하는 방법 (0) | 2023.04.26 |
Excel을 데이터 테이블로 신속하게 가져오기 (0) | 2023.04.26 |
Angular2 - 라디오 버튼 바인딩 (0) | 2023.04.26 |
디렉토리의 모든 SQL 파일 실행 (0) | 2023.04.26 |