簡単な質問かもしれませんが、簡単に見つけられないので許してください=)複数の列を選択しようとしています。私が使用するステートメントは次のとおりです。
var dataset2 = from recordset in entities.processlists
where recordset.ProcessName == processname
select recordset.ServerName, recordset.ProcessID, recordset.Username;
明らかに、これはコンパイルすらしません。正しい構文は何ですか?私はまた、メソッドベースを試しましたが、この構文にアクセスすると、「匿名型」を型「AIM.PInfo」にキャストできませんでしたときに、この構文は正しいようです。 LINQ to Entitiesは、EDMプリミティブまたは列挙型のキャストのみをサポートしています。例外。
何か案は?
var dataset = entities.processlists
.Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
.Select(x => new { x.ServerName, x.ProcessID, x.Username })
.Cast<PInfo>().ToList();
実際、コンパイラーはこの匿名型(new { x.ServerName, x.ProcessID, x.Username }
部分)をPInfoオブジェクトに変換する方法を知りません。
var dataset = entities.processlists
.Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
.Select(x => new { x.ServerName, x.ProcessID, x.Username }).ToList();
これにより、後で使用できる(匿名型の)オブジェクトのリストが得られますが、それを返したり、別のメソッドに渡したりすることはできません。
PInfoオブジェクトに適切なプロパティがある場合、次のようになります。
var dataset = entities.processlists
.Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
.Select(x => new PInfo
{
ServerName = x.ServerName,
ProcessID = x.ProcessID,
UserName = x.Username
}).ToList();
PInfoに少なくともこれらの3つのプロパティがあると仮定します。
どちらのクエリでも必要な列のみをフェッチできますが、既存のタイプ(2番目のクエリのように)を使用すると、このデータをアプリの他の部分に送信できます。
たとえば、匿名タイプを選択できます
var dataset2 =
(from recordset in entities.processlists
where recordset.ProcessName == processname
select new
{
serverName = recordset.ServerName,
processId = recordset.ProcessID,
username = recordset.Username
}).ToList();
または、選択を表す新しいクラスを作成できます。たとえば、
public class MyDataSet
{
public string ServerName { get; set; }
public string ProcessId { get; set; }
public string Username { get; set; }
}
次に、例えば次のことができます
var dataset2 =
(from recordset in entities.processlists
where recordset.ProcessName == processname
select new MyDataSet
{
ServerName = recordset.ServerName,
ProcessId = recordset.ProcessID,
Username = recordset.Username
}).ToList();
.Select
に新しいオブジェクトを作成してみませんか:
.Select(x => new PInfo{
ServerName = x.ServerName,
ProcessID = x.ProcessID,
UserName = x.Username }).ToList();
匿名タイプを選択する必要があります。
var dataset2 = from recordset
in entities.processlists
where recordset.ProcessName == processname
select new
{
recordset.ServerName,
recordset.ProcessID,
recordset.Username
};
しかし、それを別の型にキャストすることはできないので、次のようなものが欲しいと思います。
var dataset2 = from recordset
in entities.processlists
where recordset.ProcessName == processname
// Select new concrete type
select new PInfo
{
ServerName = recordset.ServerName,
ProcessID = recordset.ProcessID,
Username = recordset.Username
};
指定されたタイプのデータを取得する正しい方法です:
var dataset = entities.processlists
.Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
.Select(x => new { x.ServerName, x.ProcessID, x.Username })
.ToList() /// To get data from database
.Select(x => new PInfo()
{
ServerName = x.ServerName,
ProcessID = x.ProcessID,
Username = x.Username
});
詳細については、以下を参照してください。 エンティティはLINQ to Entitiesクエリで構築できません
var test_obj = from d in repository.DbPricing
join d1 in repository.DbOfficeProducts on d.OfficeProductId equals d1.Id
join d2 in repository.DbOfficeProductDetails on d1.ProductDetailsId equals d2.Id
select new
{
PricingId = d.Id,
LetterColor = d2.LetterColor,
LetterPaperWeight = d2.LetterPaperWeight
};
http://www.cybertechquestions.com/select-across-multiple-tables-in-entity-framework-resulting-in-a-generic-iqueryable_222801.html