207
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# の厳密さに慣れることができません!!!

4

15 に答える 15

320

EF v4 で使用できますSqlFunctions.StringConvert。int にはオーバーロードがないため、double または decimal にキャストする必要があります。コードは次のようになります。

var items = from c in contacts
            select new ListItem
            {
                Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
                Text = c.Name
            };
于 2010-07-20T17:44:02.340 に答える
12

整数から文字列への変換をクエリの外に置くことで、同様の問題を解決しました。これは、クエリをオブジェクトに入れることで実現できます。

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 });
}
于 2012-10-29T13:10:12.710 に答える
9

LinqToObject : 連絡先を使用します。AsEnumerable()

var items = from c in contacts.AsEnumerable()
            select new ListItem
            {
                Value = c.ContactId.ToString(),
                Text = c.Name
            };
于 2014-01-20T12:57:19.123 に答える
5

SqlFunctions.StringConvert は機能しますが、面倒だと思います。ほとんどの場合、SQL 側で文字列変換を実行する必要はありません。

文字列操作を行いたい場合は、最初に linq-to-entities でクエリを実行し、次に linq-to-objects で文字列を操作します。この例では、連絡先のフルネームと、2 つの整数列 (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();

さて、2 つの無名 select を書かなければならないのは面倒だと認めますが、L2E でサポートされていない文字列 (およびその他の) 関数を実行できる利便性がそれを上回っていると私は主張します。また、この方法を使用するとパフォーマンスが低下する可能性があることにも注意してください。

于 2012-01-04T03:42:48.630 に答える
4
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();
            }
        }
于 2011-04-30T11:38:57.690 に答える
3
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

まず、オブジェクトに変換してから、toString()が正しくなります。

于 2012-07-07T12:43:17.093 に答える
3

Brian Cauthon の答えは素晴らしいです! ちょっとした更新ですが、EF 6 では、クラスが別の名前空間に移動されました。したがって、EF 6 の前に、次のものを含める必要があります。

System.Data.Objects.SqlClient

EF 6 に更新する場合、または単にこのバージョンを使用している場合は、以下を含めます。

System.Data.Entity.SqlServer

EF6 で不適切な名前空間を含めることにより、コードは正常にコンパイルされますが、ランタイム エラーがスローされます。このメモが混乱を避けるのに役立つことを願っています。

于 2016-12-22T15:34:07.603 に答える
2

MVC 2アプリをMVC 3に変換しているときに同じ問題に遭遇しました。この問題に別の(クリーンな)ソリューションを提供するために、私がしたことを投稿したいと思います...

IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
    "ID", "Name", model.ProducerID);

GetProducers() は、Producers のエンティティ コレクションを返すだけです。PS SqlFunctions.StringConvert は機能しませんでした。

于 2011-06-01T21:50:16.390 に答える
2

あなたの「連絡先」が一般的なリストとして機能している場合、次のコードがうまく機能することを願っています。

var items = contact.Distinct().OrderBy(c => c.Name)
                              .Select( c => new ListItem
                              {
                                Value = c.ContactId.ToString(),
                                Text = c.Name
                              });

ありがとう。

于 2012-10-31T13:51:40.997 に答える
1

エンティティ フレームワークを使用していて、唯一の int を受け入れられるようにしたい場合は、これを linq クエリで使用できます。これを試すことができます。

var items = from c in contacts
        select new ListItem
        {
            Value = (int)ContractId 
            Text = c.Name
        };

(int) を使用すると値が int にキャストされるため、文字列を int に変換する必要がなく、必要な結果が得られるため、機能します。

これは私のプロジェクトで私のために働いた

于 2016-11-21T13:15:09.537 に答える
1

MySqlを使用すると、SqlFunctions.StringConvertうまくいきませんでした。私は自分のプロジェクトで 20 以上の場所で使用SelectListItemしているため、20 以上の LINQ ステートメントをゆがめずに機能するソリューションが必要でした。SelectedListItem私の解決策は、型変換をLINQから遠ざける整数セッターを提供するためにサブクラス化することでした。明らかに、このソリューションを一般化するのは困難ですが、私の特定のプロジェクトには非常に役立ちました。

使用するには、次の型を作成し、LINQ クエリで代わりにSelectedListItem使用し、Value の代わりに IntValue を使用します。

public class BtoSelectedListItem : SelectListItem
{
    public int IntValue
    {
        get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
        set { Value = value.ToString(); }
    }
}
于 2014-02-03T02:23:41.383 に答える
-2
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>

これを見つけるために、過去数日間の試行錯誤で多くの検索が必要でした.

これが数人のコーダーに役立つことを願っています。

于 2012-12-12T10:30:00.577 に答える
-6

試すことができますか:

var items = from c in contacts
        select new ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };
于 2009-07-01T00:31:30.500 に答える