質問

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ツーオブジェクトに刺さを操作し、LINQツーエンティティ最初にクエリを実行です。この例では、私は連絡先のフルネームを含むデータのセット、および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つの匿名の選択を記述する必要がありますが面倒取得ん付与が、私はそれはあなたが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()は正しいであろうオブジェクトに変換します。

ブライアンCauthonの答えは素晴らしいです!ほんの少しのアップデートは、EF 6のために、クラスは別の名前空間に移動しました。だから、EF 6の前に、あなたが含まれている必要があります:

System.Data.Objects.SqlClient

あなたはEF 6にアップデート、または単にこのバージョンを使用している場合は、含まれます:

System.Data.Entity.SqlServer

EF6と間違った名前空間を含めることにより、コードがうまくコンパイルされますが、ランタイムエラーがスローされます。私はこのノートにはいくつかの混乱を避けるために役立ちます願っています。

私はMVC 3に私のMVC 2アプリケーションを変換して、ちょうど私が私がやったことを投稿したいこの問題への別の(クリーン)の溶液を得たときに、

私はこの同じ問題に遭遇した...

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

GetProducers()は、単に生産のエンティティのコレクションを返します。 後記SqlFunctions.StringConvertは私のために動作しませんでした。

あなたの「接触」は、一般的なリストとして機能している場合は、

、私は次のコードはうまく機能を願っています。

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

感謝します。

MySQLを使用して、SqlFunctions.StringConvertが私のために動作しませんでした。私は私のプロジェクトで20+場所でSelectListItemを使用しているので、私は20+ LINQ文をcontortingなしで動作するソリューションを求めていました。私の解決策は、LINQから離れる型変換を移動整数セッターを提供するために、サブクラスSelectedListItemでした。明らかに、このソリューションは一般化することは困難ですが、私の特定のプロジェクトのために非常に役に立ちました。

、使用SelectedListItemの代わりに、あなたのLINQクエリで、次の種類と使用を作成し、値の代わりにIntValueを使用します。

public class BtoSelectedListItem : SelectListItem
{
    public int IntValue
    {
        get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
        set { Value = value.ToString(); }
    }
}

もう一つの解決策ます:

c.ContactId + ""

ただ、空の文字列を追加し、それを文字列に変換されます。

あなたは、エンティティフレームワークを使用して、あなたがしたい場合は、

唯一のint許容その後、あなたはこれを試すことができますLINQクエリでこれを使用することができます。

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
        };
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top