Если вы хотите удалить все объекты, не входящие в коллекцию, вам нужно найти значения ключей для строк, которые вы хотите удалить. Вот пример:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ef6Test
{
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
public class BlogDbContext : DbContext
{
public BlogDbContext() : base("BlogDbContext") { }
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
class DbInitializer : DropCreateDatabaseAlways<BlogDbContext>
{
protected override void Seed(BlogDbContext context)
{
base.Seed(context);
for (int i = 0; i < 100; i++)
{
var b = new Blog() { Name = $"Blog {i}" };
for (int j = 0; j < 10; j++)
{
var p = new Post() { Blog = b, Content = $"Content {i} {j}" };
context.Posts.Add(p);
}
context.Blogs.Add(b);
context.SaveChanges();
}
}
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DbInitializer());
//get an untracked Blog with its Posts
Blog blog;
using (var db = new BlogDbContext())
{
blog = db.Blogs.Include(b => b.Posts).AsNoTracking().First();
}
//remmove some posts
int i = 0;
foreach (var p in blog.Posts.ToList())
{
i++;
if (i%2 == 0)
{
blog.Posts.Remove(p);
}
}
//delete the posts that have been removed
using (var db = new BlogDbContext())
{
var postIdsToKeep = blog.Posts.Select(p => p.Id);
var postIdsToDelete = from p in db.Posts.AsNoTracking()
where p.BlogId == blog.Id
where !postIdsToKeep.Contains(p.Id)
select p.Id;
//construct key-only entities for the Posts to be deleted
foreach (var pid in postIdsToDelete)
{
var p = new Post() { Id = pid };
db.Entry(p).State = EntityState.Deleted;
}
db.Database.Log = m => Console.WriteLine(m);
db.SaveChanges();
}
Console.ReadKey();
}
}
}
Вы можете использовать опции json_encode() JSON_PRETTY_PRINT
:
json_encode($myArray,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);
редактировать:
, если вы используете Windows, вам нужно изменить возврат каретки, используя что-то вроде этого:
$myArray = array("test" => "data");
$buffer = json_encode($myArray,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);
echo str_replace("\n", "\r\n", $buffer);
// or
$fp = fopen('resultsv2.json', 'w');
fwrite($fp, str_replace("\n", "\r\n", $buffer));
fclose($fp);
Если вы печатаете это в браузере, вам нужно использовать <pre>
теги
<pre>
echo json_encode($myArray,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);
</pre>
Следующий код должен достичь того, что вы пытаетесь сделать. Этот код был протестирован на моем компьютере и, кажется, работает отлично.
<?php $mysqli = new mysqli('localhost', 'root', 'xxxx', 'xxxx');
if ($result = $mysqli->query("SELECT CONCAT(Datum , ' ', Tijd) as Datum, KleurL FROM metingen order by Datum ASC limit 20")) {
$current_row_number = 0;
$output = "[";
while ($row = $result->fetch_object()) {
if ($current_row_number > 0) {
$output = $output . ","; //add comma between each row
}
$output = $output . "[" . $row->KleurL . "," . $row->Datum . "]"; //add each row
$current_row_number++;
}
$output = $output . "]";
echo $output;
$fp = fopen('resultsv2.json', 'w');
fwrite($fp, $output);
fclose($fp);
}
$result->close();
$mysqli->close();
Если вы хотите правильно отформатировать вывод, используйте следующий код:
<?php $mysqli = new mysqli('localhost', 'root', '244466666', 'tkd');
if ($result = $mysqli->query("SELECT CONCAT(Datum , ' ', Tijd) as Datum, KleurL FROM metingen order by Datum ASC limit 20")) {
$current_row_number = 0;
$output = "[";
while ($row = $result->fetch_object()) {
if ($current_row_number > 0) {
$output = $output . ","; //add comma between each row
}
$output = $output . "\n\t" . "[" . "\n\t\t" . $row->KleurL . "," . "\n\t\t" . $row->Datum . "\n\t" . "]"; //add each row
$current_row_number++;
}
$output = $output . "\n]";
// echo $output; //if you want to see the output in the terminal/command prompt
echo "<pre>" . $output . "</pre>"; //if you want to see the output in a browser
$fp = fopen('resultsv2.json', 'w');
fwrite($fp, $output);
fclose($fp);
}
$result->close();
$mysqli->close();