Подтвердить что ты не робот

Выберите несколько столбцов, используя Entity Framework

Может быть, простой вопрос, но он не может легко найти его, так что простите меня =) Я пытаюсь выбрать несколько столбцов. Утверждение, которое я использую:

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();
4b9b3361

Ответ 1

Действительно, компилятор не знает, как преобразовать этот анонимный тип (часть 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 имеет по крайней мере эти три свойства.

Оба запроса позволяют вам извлекать только нужные столбцы, но использование существующего типа (например, во втором запросе) позволяет отправлять эти данные в другие части вашего приложения.

Ответ 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();

Ответ 3

Почему бы вам не создать новый объект прямо в .Select:

.Select(x => new PInfo{ 
    ServerName = x.ServerName, 
    ProcessID = x.ProcessID, 
    UserName = x.Username }).ToList();

Ответ 4

Вы либо хотите выбрать анонимный тип:

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
               };

Ответ 5

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

Ответ 6

Это правильный способ получить данные в указанном типе:

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.

Ответ 7

Вот пример кода:

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 
                 }) AsEnumerable().
               Select(y => new PInfo
               {
                   ServerName = y.ServerName,
                   ProcessID = y.ProcessID,
                   UserName = y.UserName 
               }).ToList();